import { Loader } from 'pixi.js';
import { ResourceUrl } from '../typings/resource';
const baseUrl: string = '';
// 为了防止多个组件都需要加载相同url的资源时，出现PIXI.js出现警告
// 所以当loader收到加载请求时，在cbMap中新建，url->Array<Function>的键值对
// 目的是同一个url只调用一次loader.add
var cbMap: Map<string, Array<Function>> = new Map;
var resourceMap: Map<string, Partial<Record<string, PIXI.LoaderResource>>> = new Map;
async function load(resourceUrl: Array<ResourceUrl>): Promise<Partial<Record<string, PIXI.LoaderResource>>> {
    let loader = new Loader(baseUrl);
    let arr = [...resourceUrl];
    let resourcesArr = Object.keys(loader.resources);
    // 去除已经加载过的
    arr = arr.filter(item => {
        if (resourcesArr.indexOf(item.name) >= 0) {
            return false;
        } else {
            return true;
        }
    })   
    let loadUrlArr = arr.map(item => {
        return [item.name, item.url];
    })
    
    let promise: Promise<Partial<Record<string, PIXI.LoaderResource>>>;
    promise = new Promise(async resolve => {
        let resource: Partial<Record<string, PIXI.LoaderResource>> | null = null;

        for (let item of loadUrlArr) {
            resource = await addLoad(loader, item)
        }
        if (resource) {
            resolve(resource);
        }
        
    })
    

    async function addLoad(loader: PIXI.Loader, item: Array<string>): Promise<Partial<Record<string, PIXI.LoaderResource>>> {
        return new Promise(resolve => {
            if (!cbMap.has(item[1])){
                cbMap.set(item[1], []);
                // 注意loader.add.load(cb)中cb作用域中的loader为第一次加载时的loader
                loader.add(item[0], item[1]).load((loader, resource) => {
                    cbMap.get(item[1])!.forEach(fun => {
                        fun(resource);
                    })
                    resourceMap.set(item[1], resource);
                    cbMap.set(item[1], []);
                    resolve(resource);
                })
            } else {
                if (resourceMap.has(item[1])) {
                    loader.resources[item[0]] = <PIXI.LoaderResource>(resourceMap.get(item[1])![item[0]]);
                    resolve(loader.resources);
                } else {
                    // 这里的回调函数中的loader为每次加载时，自身的loader
                    cbMap.get(item[1])!.push((resources: any) => {
                        //加载完成后，要将LoaderResource放入对应loader的resources中
                        loader.resources[item[0]] = <PIXI.LoaderResource>resources[item[0]];
                        resolve(loader.resources);
                    })
                }
            }
              
            
        })
    }
    return promise;
    
}

export {
    load
}
